#include "mainwindow.h"

#include <QApplication>
#include <QMenuBar>

//QMainWindow 是一个为用户提供主窗口程序的类，继承自 QWidget 类,并且提供了一个预定义的布局
//QMainWindow 包含 一个菜单栏（menu bar）、多个工具栏(tool bars)
//多个浮动窗口（铆接部件）(dock widgets)、一个状态栏(status bar) 和一个 中心部件(central widget)
//它是许多应用程序的基础，如文本编辑器，图片编辑器等

void QMenuBarTest(MainWindow& w) {
    //创建菜单栏
    QMenuBar* menuBar = new QMenuBar();
    //将菜单栏放入窗口中
    w.setMenuBar(menuBar);

    //创建菜单,并且绑定快捷键,通过alt + 字母就可以实现快捷键的效果,可以不管大小写
    //QShortCut也可以实现类似的效果,但是太麻烦了
    QMenu* menu1 = new QMenu("文件 (&F)");
    //如果给QMenu设置图标,当前QMenu是长在QMenuBar上的，此时文本就不显示图标覆盖了文本
    menu1->setIcon(QIcon(":/image/1.png"));
    QMenu* menu2 = new QMenu("编辑 (&E)");
    QMenu* menu3 = new QMenu("构建 (&T)");

    //添加菜单到菜单栏中
    menuBar->addMenu(menu1);
    menuBar->addMenu(menu2);
    menuBar->addMenu(menu3);

    //在 Qt 中，并没有专门的菜单项类，可以通过 QAction 类，抽象出公共的动作。如在菜单中添加菜单项
    //QAction 可以给菜单栏使用, 也可以给工具栏使用
    //创建菜单项
    QAction* act1 = new QAction("打开 (&O)");
    //如果是子菜单,图标和文本是都能显示的
    act1->setIcon(QIcon(":/image/2.png"));
    QAction* act2 = new QAction("关闭 (&C)");
    act2->setIcon(QIcon(":/image/3.png"));
    QAction* act3 = new QAction("创建");

    //将菜单项添加到菜单上
    menu1->addAction(act1);
    //添加菜单分割线
    menu1->addSeparator();
    menu1->addAction(act2);
    menu1->addSeparator();
    menu1->addAction(act3);

    //给action添加信号槽
    // 不绑定槽函数, 通过快捷键选中也没啥反应
    //当用户点击一个菜单项、工具栏按钮或通过快捷键触发一个动作时，triggered 信号会被发射
    QObject::connect(act1, &QAction::triggered, &w, &MainWindow::open);
    QObject::connect(act2, &QAction::triggered, &w, &MainWindow::close);

    //通过嵌套的方式,添加更多层级的子菜单
    QMenu* menuParent = new QMenu("父菜单");
    QMenu* menuChild = new QMenu("子菜单");
    QMenu* menuChild2 = new QMenu("子子菜单");
    menuChild->addMenu(menuChild2);
    menuBar->addMenu(menuParent);
    menuParent->addMenu(menuChild);

    QAction* action1 = new QAction("菜单项1");
    QAction* action2 = new QAction("菜单项2");
    menuChild->addAction(action1);
    menuChild->addAction(action2);
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    //qt中很多GUI类都是不可拷贝的,记得传递引用
    QMenuBarTest(w);

    w.show();
    return a.exec();
}
